iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 22
1

先前某個情境

Table-A

Id	A	B	C
1	A1	B1	123
2	A1	B2	551
3	A2	B3	13

Table-B

Id	A	B	D
1	A1	B1	11
2	A1	B2	76
3	A2	B3	9

要將 Table-A 的 C 欄位資料儲存到 Table-B 的 D 欄位
使用 CURSOR 將 Table-A 的 A|B 欄位逐筆比對更新到 Table-B 中的 D 欄位

為了保持一致性設定了 Transaction
為了比對快速對 A|B 欄位加入了索引

問題解決了
但是卻產生了另一個問題

先來討論 CURSOR 的特性
CURSOR 僅使用「單一核心」並逐筆進行(不會鎖定整張資料表)

上述情境最佳解

應使用 UPDATE JOIN 來善用多核心進行處理
CURSOR 僅單一核心的特性會讓資料處理時間相較之下較久
這時再加上 Transaction 等於又將資料表鎖定起來

  • 要減少資料鎖定情況可以考慮使用 CURSOR
  • 使用 CURSOR 不應使用 Transaction

先前使用 CURSOR 情境

將前一個月份的「存取紀錄資料表」搬移到封存的資料表
此時「存取紀錄資料表」還是處於上線狀態
新的紀錄還是可以寫到「存取紀錄資料表」中


上一篇
使用 CROSS APPLY 進行資料表轉置
下一篇
資料匯入系統的經驗談
系列文
SQL Server 資料庫程式設計/管理/經驗筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言